//给你一个字符串 paragraph 和一个表示禁用词的字符串数组 banned ，返回出现频率最高的非禁用词。题目数据 保证 至少存在一个非禁用词，且答案 
//唯一 。 
//
// paragraph 中的单词 不区分大小写 ，答案应以 小写 形式返回。 
//
// 注意 单词不包含标点符号。 
//
// 
//
// 示例 1： 
//
// 
//输入：paragraph = "Bob hit a ball, the hit BALL flew far after it was hit.", 
//banned = ["hit"]
//输出："ball"
//解释：
//"hit" 出现了 3 次，但它是禁用词。
//"ball" 出现了两次（没有其他单词出现这么多次），因此它是段落中出现频率最高的非禁用词。
//请注意，段落中的单词不区分大小写，
//标点符号会被忽略（即使它们紧挨着单词，如 "ball,"），
//并且尽管 "hit" 出现的次数更多，但它不能作为答案，因为它是禁用词。
// 
//
// 示例 2： 
//
// 
//输入：paragraph = "a.", banned = []
//输出："a"
// 
//
// 
//
// 提示： 
//
// 
// 1 <= paragraph.length <= 1000 
// paragraph 由英文字母、空格 ' '、和以下符号组成："!?',;." 
// 0 <= banned.length <= 100 
// 1 <= banned[i].length <= 10 
// banned[i] 仅由小写英文字母组成 
// 
//
// Related Topics 数组 哈希表 字符串 计数 👍 251 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public String mostCommonWord(String paragraph, String[] banned) {

//        //1.
//        String[] words = paragraph.toLowerCase().split("[^a-zA-Z]+");//特殊字符可能出现一到多个
//        Set<String> bannedSet = new HashSet<>(Arrays.asList(banned));
//        Map<String, Integer> counts = new HashMap<>();
//        for (String word : words) {
//            if (!bannedSet.contains(word)) {
//                counts.put(word, counts.getOrDefault(word, 0) + 1);
//            }
//        }
////        //输出bannedSet
////        System.out.println(bannedSet);
////        //输出counts
////        System.out.println(counts);
//        return Collections.max(counts.entrySet(), Map.Entry.comparingByValue()).getKey();
//        //2.
//        String[] words = paragraph.toLowerCase().split("[^a-zA-Z]+");
//        Set<String> bannedSet = Set.of(banned);
//        HashMap<String, Integer> map = new HashMap<>();
//        for (String word : words) {
//            if(!bannedSet.contains(word))
//                map.compute(word, (k, v)->v==null?1:v+1);
//        }
////        return map.entrySet().stream().max(Map.Entry.comparingByValue()).get().getKey();
//        int max = 0;
//        String res = "";
//        for(Map.Entry<String, Integer> entry: map.entrySet()){
//            Integer value = entry.getValue();
//            if(value > max){
//                max = value;
//                res = entry.getKey();
//            }
//        }
//        return res;
        //3.
        Set<String> set = Set.of(banned);
        HashMap<String, Integer> map = new HashMap<>();
        char[] chars = paragraph.toLowerCase().toCharArray();
        StringBuilder sb = new StringBuilder();
        for (char aChar : chars) {
            if(aChar >= 'a' && aChar <='z'){
                sb.append(aChar);
            }else{
                String string = sb.toString();
//                if(!set.contains(string)){
//                    map.compute(string, (k,v)->v==null?1:v+1);
//                }
                if (!string.isEmpty() && !set.contains(string)) {
                    map.put(string, map.getOrDefault(string, 0) + 1);
                }
                sb.setLength(0);
            }
        }
        if(sb.length()>0){
            String string = sb.toString();
            if(!set.contains(string)){
                map.compute(string,(k,v)->v==null?1:v+1);
            }
        }
//        System.out.println(map);
        int max = 0;
        String res = "";
        for(Map.Entry<String, Integer> entry:map.entrySet()){
            if(entry.getValue()>max){
                max = entry.getValue();
                res = entry.getKey();
            }
        }
        return res;
//        // 修正1：使用HashSet并处理可能的null
//        Set<String> bannedSet = banned == null ? Collections.emptySet() : new HashSet<>(Arrays.asList(banned));
//
//        Map<String, Integer> countMap = new HashMap<>();
//        char[] chars = paragraph.toLowerCase().toCharArray();
//        StringBuilder sb = new StringBuilder();
//
//        for (char c : chars) {
//            if (c >= 'a' && c <= 'z') {
//                sb.append(c);
//            } else {
//                String word = sb.toString();
//                // 修正2：过滤空字符串
//                if (!word.isEmpty() && !bannedSet.contains(word)) {
//                    countMap.put(word, countMap.getOrDefault(word, 0) + 1);
//                }
//                sb.setLength(0);
//            }
//        }
//
//        // 处理段落末尾的单词
//        String lastWord = sb.toString();
//        if (!lastWord.isEmpty() && !bannedSet.contains(lastWord)) {
//            countMap.put(lastWord, countMap.getOrDefault(lastWord, 0) + 1);
//        }
//
//        // 寻找出现次数最多的单词
//        String result = "";
//        int maxCount = 0;
//        for (Map.Entry<String, Integer> entry : countMap.entrySet()) {
//            if (entry.getValue() > maxCount) {
//                maxCount = entry.getValue();
//                result = entry.getKey();
//            }
//        }
//
//        return result;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
